import View from "./View";

export default class Model {

    ////////////////////////////////////////////////////////////////////////////
    //  constructor
    ////////////////////////////////////////////////////////////////////////////

    constructor(name, data = null) {
        this.data = {};
        if (name === undefined || name === '') {
            throw new Error('Model name can not undefined!');
        }
        if (Model.retrieveModel(name) != null) {
            throw new Error('Model[' + name + ']' + ' instance  already constructed !');
        }
        this.name = name;
        if (data != null) {
            Object.keys(data).map(key => {
                this.data[key] = data[key];
            });
        }
        Model.modelList.push(this);
        this.onRegister();
    }

    ////////////////////////////////////////////////////////////////////////////
    //  public static methods
    ////////////////////////////////////////////////////////////////////////////

    static retrieveModel(name) {
        var len = Model.modelList.length;
        for (var i = 0; i < len; ++i) {
            if (Model.modelList[i].name === name) {
                return Model.modelList[i];
            }
        }
        return null;
    }

    static removeModel(name) {
        var len = Model.modelList.length;
        for (var i = 0; i < len; ++i) {
            if (Model.modelList[i].name === name) {
                Model.modelList[i].onRemove();
                Model.modelList[i].data = null;
                Model.modelList[i] = null;
                Model.modelList.splice(i, 1);
                break;
            }
        }
    }

    ////////////////////////////////////////////////////////////////////////////
    //  public methods
    ////////////////////////////////////////////////////////////////////////////

    onRegister() {
        // overwrite
    }

    onRemove() {
        // overwrite
    }

    sendEvent(type, data = null) {
        View.notifyViews(type, data, this);
    }
}

////////////////////////////////////////////////////////////////////////////
// public static property
////////////////////////////////////////////////////////////////////////////
Model.modelList = [];